package com.atguigu.yygh.hosp.listener;/*
 * @author: XueYouPeng
 * @time: 2023/6/19 19:23
 */

import com.atguigu.mq.consts.MqConst;
import com.atguigu.mq.service.RabbitService;
import com.atguigu.yygh.hosp.repository.ScheduleRepository;
import com.atguigu.yygh.model.hosp.Schedule;
import com.atguigu.yygh.vo.msm.MsmVo;
import com.atguigu.yygh.vo.order.OrderMqVo;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.util.Date;

//监听程序，负责监听第一个队列
@Component
public class HospitalReceiver {

    //创建不同的方法，用于监听不同的队列；方法参数
    @Autowired
    ScheduleRepository scheduleRepository;

    @Autowired
    RabbitService rabbitService;

    //提交订单和取消订单最后都向第一个队列中发送消息了
    //此监听程序监听到了消息后，执行什么逻辑？ 需要判断区分是提交订单的消息还是取消订单的消息，区别在哪？提交订单时orderMqVo中的两个num有值；取消订单时两个num没有值
    @RabbitListener(
            bindings = {
                    @QueueBinding(
                            value = @Queue(name = MqConst.QUEUE_ORDER,durable = "true"), //队列名称
                            exchange = @Exchange(name = MqConst.EXCHANGE_DIRECT_ORDER), //交换机（默认direct类型）
                            key = MqConst.ROUTING_ORDER //队列和交换机绑定时指定的key
                    )
            }
    )
    public void listenOne(OrderMqVo orderMqVo){
        //判断num是否有值
        System.out.println("医院服务监听到第一个队列中的消息");

        String scheduleId = orderMqVo.getScheduleId();//mongodb中的排班id
        //医院端返回的两个num
        Integer reservedNumber = orderMqVo.getReservedNumber();
        Integer availableNumber = orderMqVo.getAvailableNumber();

        Schedule schedule = scheduleRepository.findById(scheduleId).get();


        if(StringUtils.isEmpty(reservedNumber) || StringUtils.isEmpty(availableNumber)){
            //取消订单（直接将mg中排班的availableNumber+1即可）
            schedule.setAvailableNumber(schedule.getAvailableNumber()+1);
            scheduleRepository.save(schedule);
        }else{
            //提交订单（医院端返回的两个num,更新到mongodb中的指定排班上）
            schedule.setReservedNumber(reservedNumber);
            schedule.setAvailableNumber(availableNumber);
            schedule.setUpdateTime(new Date());
            scheduleRepository.save(schedule);//更新
        }

        //将msmVo发送到第二个队列中
        MsmVo msmVo = orderMqVo.getMsmVo();
        rabbitService.sendMessage(MqConst.EXCHANGE_DIRECT_MSM,MqConst.ROUTING_MSM_ITEM,msmVo);
    }
}
